#include <IRremote.h>  
#include <CyberLib.h>
#include <avr/wdt.h> 

#define robot_pins D4_Out; D5_Out; D6_Out; D7_Out
#define robot_go D4_Low; D5_High; D6_High; D7_Low
#define robot_back D4_High; D5_Low; D6_Low; D7_High
#define robot_left  D4_Low; D5_High; D6_Low; D7_Low
#define robot_right D4_Low; D5_Low; D6_High; D7_Low;
#define robot_stop D4_Low; D5_Low; D6_Low; D7_Low

IRrecv irrecv(8);  //вход для ик приемника
decode_results results;  
unsigned long ir_go, ir_back, ir_left, ir_right, ir_stop, ir_tmp;


void setup()  
{  
  robot_pins; //управление мотрами
  D11_Out;  D11_Low; //пищалка
  D16_In;  //вход для перемычки
  D16_High;  //включить подтяжку
  robot_stop;
  
  irrecv.enableIRIn(); // включить приемник 
  irrecv.blink13(true);  // включить мигание светодиода при приеме
  
  ProgPush() ; //программирование кнопок
  
  ir_go=ReadEEPROM_Long(0);//прочитать команду из EEPROM 
  ir_back=ReadEEPROM_Long(1);//прочитать команду из EEPROM
  ir_left=ReadEEPROM_Long(2);//прочитать команду из EEPROM
  ir_right=ReadEEPROM_Long(3);//прочитать команду из EEPROM
  ir_stop=ReadEEPROM_Long(4);//прочитать команду из EEPROM   

  randomSeed(A6_Read); //Получить случайное значение 
  for(uint8_t i=0; i<5; i++) beep(70, random(100, 2000)); //звуковое оповещение готовности робота  

wdt_enable (WDTO_8S);    //Сторожевая собака 8сек.
}  
   
void loop() 
{   Start

   if (irrecv.decode(&results))   //если был сигнал с пульта
     { 
        ir_tmp=results.value;
        
      if(ir_go==ir_tmp) //если принятый код равен коду который в памяти то вперед
        {
          robot_go;
          beep(100,300);
        } else  
        
      if(ir_back==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          robot_back;
          beep(100,400);  
        } else
        
      if(ir_left==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          robot_right;
          beep(100,450);  
        } else   
        
      if(ir_right==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          robot_left;
          beep(100,500);  
        } else         
        
      if(ir_stop==ir_tmp) //если принятый код равен коду который в памяти то стоп
        {
         robot_stop; 
         beep(10,300);
         beep(10,400); 
         beep(10,300);
        } 
     irrecv.resume();            //очистить входящий буфер 
     
    } 
  
wdt_reset(); //покормить собаку, что бы она не сбежала    
End }
//////////////////////////////////////////////////////////////////////////////////////////////
void SavePush(uint8_t addr)  //сохранить нажатие кнопки
{
delay_ms(400);  //задержка для крректной работы
       for(uint32_t i=0; i<2000000; i++)//ждем нажатия кнопки пульта
       {
         if (irrecv.decode(&results))   //если был сигнал с пульта
          {                              // то сохраняем результат в EEPROM 
            WriteEEPROM_Long(addr, results.value);            
            break;                  //прервать цикл
          }
         wdt_reset();           //покормить собаку
        }
      delay_ms(100);  
       irrecv.resume();            //очистить входящий буфер
}
//////////////////////////////////////////////////////////////////////////////////////////////////
void ProgPush() 
{
if(D15_Read==0)//если кнопка нажата
   {
         beep(50,800); 
          beep(50,900);
         beep(50,1000);
          SavePush(0);  //сохранить первое кодовое значение пульта
         beep(80,800); 
          SavePush(1);  //сохранить второе кодовое значение пульта
         beep(80,900);  
          SavePush(2);  //сохранить третье кодовое значение пульта
         beep(80,850);  
          SavePush(3); //сохранить четвертое кодовое значение пульта
          beep(80,950);  
          SavePush(4);  //сохранить пятое кодовое значение пульта       
         beep(50,1000); 
          beep(50,900);
         beep(50,800);   
   } 
}
